/**
 * 图层类型接口，定义了图层的相关信息
 */
export interface LayerType {
    /**
     * 数据集编号
     */
    dataset: number;
    /**
     * 图层编号
     */
    layer: number;
    /**
     * 图层的值对象，包含可见性和颜色信息
     */
    value: {
        /**
         * 图层是否可见
         */
        visible: boolean;
        /**
         * 图层颜色，可为空
         */
        color: string | null
    };
}

/**
 * 颜色模式类型，包含三种模式：高亮、替换、混合
 * "HIGHLIGHT" - 高亮模式
 * "REPLACE" - 替换模式
 * "MIX" - 混合模式
 */
export type ColorModeType = "HIGHLIGHT" | "REPLACE" | "MIX";

/**
 * API 接口地址集合
 */
export const apis = {
    /**
     * 获取图层配置的 API 地址
     */
    layerconfigfind: `/ts/layer/config/get`,
    /**
     * 保存图层配置的 API 地址
     */
    layerconfigsave: `/ts/layer/config/put`,
    /**
     * 获取要素属性的 API 地址
     */
    featureproperty: `/ts/editor/property`,
    /**
     * 批量编辑要素的空间状态的 API 地址
     */
    featureeditormuti: `/ts/editor/update`,
    /**
     * 获取切片服务的端口的 API 地址
     */
    getts: "/ts/info",
};

/**
 * 获取图层配置
 * @param baseUrl - 基础 URL
 * @param tileServiceName - 切片服务名称
 * @returns {Promise<LayerType[]>} - 返回一个 Promise，解析为图层配置数组
 */
export const _getLayerConfig = async (baseUrl: string, tileServiceName: string, useEarthDSToken: boolean, earthdstoken: string) => {
    try {
        // 从本地存储中获取授权令牌
        const authToken = window.localStorage.getItem('Authorization');
        let finalUrl = baseUrl + `${apis.layerconfigfind}?tileServiceName=${tileServiceName}`;
        // 根据标志位决定token传递方式
        if (useEarthDSToken) {
            // URL参数方式：直接追加token参数
            finalUrl += `&earthdstoken=${encodeURIComponent(earthdstoken)}`;
        }
        const requestOptions = {
            headers: {
                ...(!useEarthDSToken && authToken ? { 'Authorization': authToken } : {})
            },
            mode: "cors", // 用来决定是否允许跨域请求  
        };
        // 发送请求获取图层配置
        // @ts-ignore
        const res = await fetch(finalUrl, requestOptions);
        const jsonStr = await res.text();
        const json = JSON.parse(jsonStr) as LayerType[];
        return json;
    } catch (error) {
        console.error(error);
    }
}

/**
 * 保存图层配置
 * @param baseUrl - 基础 URL
 * @param tileServiceName - 切片服务名称
 * @param layerConfig - 可选的图层配置对象，默认为空对象
 * @returns {Promise<any>} - 返回一个 Promise，解析为保存结果
 */
export const _saveLayerConfig = async (baseUrl: string, tileServiceName: string, useEarthDSToken: boolean, earthdstoken: string, layerConfig?: LayerType[]) => {
    try {
        // 从本地存储中获取授权令牌
        const authToken = window.localStorage.getItem('Authorization');
        let finalUrl = baseUrl + apis.layerconfigsave;
        const _layerConfig = layerConfig ?? {};
        // 根据标志位决定token传递方式
        if (useEarthDSToken) {
            // URL参数方式：直接追加token参数
            finalUrl += `?earthdstoken=${encodeURIComponent(earthdstoken)}`;
        }
        const requestOptions = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                ...(!useEarthDSToken && authToken ? { 'Authorization': authToken } : {})
            },
            mode: "cors", // 用来决定是否允许跨域请求  
            body: JSON.stringify({
                tileServiceName: tileServiceName,
                layerConfig: JSON.stringify(_layerConfig)
            })
        };
        // 发送请求保存图层配置
        // @ts-ignore
        const res = await fetch(finalUrl, requestOptions);
        const jsonStr = await res.text();
        const json = JSON.parse(jsonStr) as any;
        return json;
    } catch (error) {
        console.error(error);
    }
}

/**
 * 获取切片服务的端口
 * @param url - 请求的 URL
 * @returns {Promise<string | undefined>} - 返回一个 Promise，解析为切片服务的端口号，如果请求失败则返回 undefined
 */
export const _getport = async (url: string, useEarthDSToken: boolean, earthdstoken: string) => {
    try {
        // 从本地存储中获取授权令牌
        const authToken = window.localStorage.getItem('Authorization');
        let finalUrl = url;
        // 根据标志位决定token传递方式
        if (useEarthDSToken) {
            // URL参数方式：直接追加token参数
            finalUrl += `?earthdstoken=${encodeURIComponent(earthdstoken)}`;
        }
        const requestOptions = {
            headers: {
                ...(!useEarthDSToken && authToken ? { 'Authorization': authToken } : {}),
            },
            mode: "cors", // 用来决定是否允许跨域请求  
        };
        // 发送请求获取切片服务的端口
        // @ts-ignore
        const res = await fetch(finalUrl, requestOptions);
        const jsonStr = await res.text();
        const json = JSON.parse(jsonStr);
        if (json.status == "ok") {
            return json.data.port as string;
        } else {
            console.error(json.status);
            return undefined;
        }
    } catch (error) {
        console.error(error);
    }
}

/**
 * 获取要素属性
 * @param baseUrl - 基础 URL
 * @param tileServiceName - 切片服务名称
 * @param featureId - 要素 ID
 * @returns {Promise<{ [k: string]: any } | undefined>} - 返回一个 Promise，解析为要素属性对象，如果请求失败则返回 undefined
 */
export const _getFeatureProperty = async (baseUrl: string, tileServiceName: string, featureId: string, useEarthDSToken: boolean, earthdstoken: string) => {
    try {
        const data = { tileServiceName, featureId };
        const token = window.localStorage.getItem("Authorization");
         let finalUrl = baseUrl + apis.featureproperty;
        // 根据标志位决定token传递方式
        if (useEarthDSToken) {
            // URL参数方式：直接追加token参数
            finalUrl += `?earthdstoken=${encodeURIComponent(earthdstoken)}`;
        }
        const req = await fetch(finalUrl, {
            method: "post",
            headers: {
                'Content-Type': 'application/json',
                ...(!useEarthDSToken &&token ? { 'Authorization': token } : {})
            },
            body: JSON.stringify(data),
            mode: "cors", // 用来决定是否允许跨域请求  
        });
        const jsonStr = await req.text();
        const res = JSON.parse(jsonStr);
        if (res.status == "ok") {
            return res.data as { [k: string]: any };
        } else {
            console.error(res.data.status);
            return undefined;
        }
    } catch (error) {
        console.error(error);
    }
}
